
package com.badlogic.gdx.utils;

import static org.junit.Assert.*;

import org.junit.Test;

public class BitsTest {

	@Test
	public void testHashcodeAndEquals () {
		Bits b1 = new Bits();
		Bits b2 = new Bits();

		b1.set(1);
		b2.set(1);

		assertEquals(b1.hashCode(), b2.hashCode());
		assertTrue(b1.equals(b2));

		// temporarily setting/clearing a single bit causing
		// the backing array to grow
		b2.set(420);
		b2.clear(420);

		assertEquals(b1.hashCode(), b2.hashCode());
		assertTrue(b1.equals(b2));

		b1.set(810);
		b1.clear(810);

		assertEquals(b1.hashCode(), b2.hashCode());
		assertTrue(b1.equals(b2));
	}

	@Test
	public void testXor () {
		Bits b1 = new Bits();
		Bits b2 = new Bits();

		b2.set(200);

		// b1:s array should grow to accommodate b2
		b1.xor(b2);

		assertTrue(b1.get(200));

		b1.set(1024);
		b2.xor(b1);

		assertTrue(b2.get(1024));
	}

	@Test
	public void testOr () {
		Bits b1 = new Bits();
		Bits b2 = new Bits();

		b2.set(200);

		// b1:s array should grow to accommodate b2
		b1.or(b2);

		assertTrue(b1.get(200));

		b1.set(1024);
		b2.or(b1);

		assertTrue(b2.get(1024));
	}

	@Test
	public void testAnd () {
		Bits b1 = new Bits();
		Bits b2 = new Bits();

		b2.set(200);
		// b1 should cancel b2:s bit
		b2.and(b1);

		assertFalse(b2.get(200));

		b1.set(400);
		b1.and(b2);

		assertFalse(b1.get(400));
	}

	@Test
	public void testCopyConstructor () {
		Bits b1 = new Bits();
		b1.set(50);
		b1.set(100);
		b1.set(150);

		Bits b2 = new Bits(b1);
		assertTrue(b1 != b2);
		assertTrue(b1.containsAll(b2));
		assertTrue(b2.containsAll(b1));
		assertTrue(b1.equals(b2));
	}
}
